K3s vs K8s 完整对比教程

K3s vs K8s 完整对比教程

一、什么是 K8s 和 K3s

K8s(Kubernetes) — CNCF 维护的容器编排标准,功能完整,适合企业级大规模集群。

K3s — Rancher Labs(现 SUSE)开发的轻量级 Kubernetes 发行版,单个二进制文件 < 100MB,完全兼容 K8s API,专为边缘计算、IoT、开发环境和资源受限场景设计。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

二、核心架构对比

┌─────────────────────────────────────────────────────────────┐
│                    K8s 架构(标准)                           │
│                                                             │
│  Control Plane:                                             │
│  ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌──────────────┐  │
│  │kube-api  │ │controller │ │scheduler │ │  etcd (集群)  │  │
│  │server    │ │manager    │ │          │ │              │  │
│  └──────────┘ └───────────┘ └──────────┘ └──────────────┘  │
│                                                             │
│  Worker Node:                                               │
│  ┌──────────┐ ┌───────────┐ ┌──────────────────┐           │
│  │ kubelet  │ │kube-proxy │ │ Container Runtime│           │
│  │          │ │           │ │ (containerd/CRI-O)│          │
│  └──────────┘ └───────────┘ └──────────────────┘           │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                    K3s 架构(精简)                           │
│                                                             │
│  Server (单进程):                                            │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  k3s server (内含 api-server + scheduler +          │    │
│  │  controller-manager + SQLite/etcd + containerd)     │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
│  Agent:                                                     │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  k3s agent (内含 kubelet + flannel + containerd)    │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

三、详细对比表

维度 K8s K3s
二进制大小 数百 MB(多组件) < 100MB(单二进制)
最低内存 Control Plane 2GB+ Server 512MB 可运行
默认存储后端 etcd(集群模式) SQLite(单节点)/ 可选 etcd、MySQL、PostgreSQL
容器运行时 containerd / CRI-O 内置 containerd
网络 CNI 需手动安装(Calico/Cilium 等) 内置 Flannel(可替换)
Ingress 需手动部署 内置 Traefik
负载均衡 需 MetalLB 或云 LB 内置 ServiceLB(Klipper)
存储 需手动配置 CSI 内置 Local Path Provisioner
安装时间 30 分钟 - 数小时 < 1 分钟
HA 方案 3+ etcd 节点 嵌入式 etcd 或外部 DB
认证 CNCF 认证 同样通过 CNCF 一致性认证
Helm/kubectl 兼容 完全兼容
适用规模 数百到数千节点 建议 < 500 节点
GPU 支持 完整 支持(需额外配置)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

四、安装对比

K8s 安装(kubeadm 方式)

bash

--- 每台机器都要执行 ---

1. 安装容器运行时

sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

2. 安装 kubeadm/kubelet/kubectl

sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

3. 关闭 swap

sudo swapoff -a

--- Master 节点 ---

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

4. 安装 CNI(以 Calico 为例)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

--- Worker 节点 ---

sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

K3s 安装

# --- Server 节点(一条命令)---
curl -sfL https://get.k3s.io | sh -

# 获取 token
sudo cat /var/lib/rancher/k3s/server/node-token

# --- Agent 节点(一条命令)---
curl -sfL https://get.k3s.io | K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> sh -

# kubectl 直接可用
sudo k3s kubectl get nodes
# 或复制 kubeconfig
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

安装时间对比:K8s 约 30-60 分钟 vs K3s 约 30 秒。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


## 五、高可用(HA)对比

### K8s HA

                    ┌──────────────┐
                    │  Load Balancer│
                    └──────┬───────┘
              ┌────────────┼────────────┐
              ▼            ▼            ▼
        ┌──────────┐ ┌──────────┐ ┌──────────┐
        │ Master 1 │ │ Master 2 │ │ Master 3 │
        │ etcd     │ │ etcd     │ │ etcd     │
        │ api-srv  │ │ api-srv  │ │ api-srv  │
        └──────────┘ └──────────┘ └──────────┘


需要:3 台 Master + 外部 LB + etcd 集群管理,运维复杂度高。

### K3s HA(嵌入式 etcd)

bash
# 第一个 Server
curl -sfL https://get.k3s.io | sh -s - server --cluster-init

# 加入更多 Server
curl -sfL https://get.k3s.io | K3S_TOKEN=<token> sh -s - server --server https://<first-server>:6443


### K3s HA(外部数据库)

bash
# 使用已有的 PostgreSQL/MySQL
curl -sfL https://get.k3s.io | sh -s - server \
  --datastore-endpoint="postgres://user:pass@db-host:5432/k3s"


K3s 的 HA 配置明显更简单,且支持复用已有的关系型数据库。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


## 六、资源消耗实测对比

场景:空集群,1 Server + 2 Worker

┌──────────────┬────────────────┬────────────────┐
│ │ K8s (kubeadm)│ K3s │
├──────────────┼────────────────┼────────────────┤
│ Master 内存 │ ~1.2 GB │ ~400 MB │
│ Worker 内存 │ ~300 MB │ ~150 MB │
│ 磁盘占用 │ ~3 GB │ ~200 MB │
│ 系统组件 Pod │ 8-10 个 │ 3-5 个 │
│ 启动时间 │ 2-5 分钟 │ 15-30 秒 │
└──────────────┴────────────────┴────────────────┘



K3s 在资源消耗上大约是 K8s 的 1/3 到 1/5。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


## 七、日常运维对比

### 升级

```bash
# K8s 升级(需逐节点操作)
sudo apt-get update
sudo apt-get install -y kubeadm=1.31.x-*
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.31.x
sudo apt-get install -y kubelet=1.31.x-* kubectl=1.31.x-*
sudo systemctl daemon-reload && sudo systemctl restart kubelet
# 每个 Worker 重复以上步骤...

# K3s 升级(重新运行安装脚本即可)
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=latest sh -

备份

# K8s — 需要单独备份 etcd
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# K3s — SQLite 模式直接复制文件
sudo cp /var/lib/rancher/k3s/server/db/state.db /backup/k3s-state.db

# K3s — etcd 模式
k3s etcd-snapshot save --name my-backup

卸载

bash

K8s

kubeadm reset
sudo rm -rf /etc/kubernetes /var/lib/etcd ~/.kube

K3s

/usr/local/bin/k3s-uninstall.sh # Server
/usr/local/bin/k3s-agent-uninstall.sh # Agent

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

八、选型决策树

你的场景是什么?

│
├─ 边缘/IoT/ARM 设备 ──────────────────→ K3s
├─ 开发/测试/CI 环境 ──────────────────→ K3s
├─ 个人项目 / 小团队(< 10 服务)──────→ K3s
├─ VPS 上跑几个服务(内存 < 4GB)──────→ K3s
│
├─ 企业生产环境(> 50 节点)───────────→ K8s(或托管 K8s)
├─ 需要高级网络策略(Cilium/Istio)───→ K8s
├─ 多租户隔离要求高 ──────────────────→ K8s
├─ 已有 K8s 运维团队 ─────────────────→ K8s
│
└─ 不想自己运维 ──────────────────────→ 托管服务
   ├─ AWS EKS
   ├─ GCP GKE
   ├─ Azure AKS
   └─ DigitalOcean DOKS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

九、从 K3s 迁移到 K8s

因为 K3s 完全兼容 K8s API,迁移很平滑:

# 1. 导出所有资源
k3s kubectl get all --all-namespaces -o yaml > all-resources.yaml

# 2. 导出关键资源(排除系统命名空间)
for ns in $(k3s kubectl get ns -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\n' | grep -v kube-); do
  k3s kubectl -n $ns get deploy,svc,configmap,secret,ingress -o yaml > "${ns}-resources.yaml"
done

# 3. 在 K8s 集群上应用
kubectl apply -f all-resources.yaml

Helm charts、kubectl 命令、CI/CD 流水线都不需要改动。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

十、总结

K3s K8s
一句话 轻量快速,开箱即用 功能完整,生态丰富
学习曲线
运维成本
灵活性 够用 极高
适合 个人/小团队/边缘/开发 企业/大规模/复杂场景

实际建议: 如果你不确定选哪个,先用 K3s。它和 K8s API 完全兼容,学到的知识可以直接迁移,等真正遇到 K3s 的瓶颈时再切换到 K8s 也不迟。对于在 VPS 上跑几个服务的场景,K3s 是明显更合适的选择。